package com.ytf.test.third;

/**
 * @author: YTF
 * @date: 2024/9/13 9:56
 * @version: 1.0
 * @description: 按位操作符
 */
public class BitwiseOperators {

    public static void main(String[] args) {
        // 十六进制数1A等于十进制数26 二进制11010
        int i1 = 0x1A;
        // 十六进制数1B等于十进制数27 二进制11011
        int i2 = 0x1B;
        //如果为负数会怎么样
        // 负十六进制数1A等于十进制数-26 二进制11111111111111111111111111100110
        // i1 = -0x1A;
        // 负十六进制数1B等于十进制数-27 二进制11111111111111111111111111100101
        // i2 = -0x1B;
        System.out.println("i1:"+i1+" i2:"+i2);
        System.out.println("i1 binary: "+Integer.toBinaryString(i1)+" " +
                "i2 binary: "+Integer.toBinaryString(i2));
        System.out.println("i1&i2: "+(i1&i2) +" result: "+Integer.toBinaryString(i1&i2));
        System.out.println("i1|i2: "+(i1|i2) +" result: "+Integer.toBinaryString(i1|i2));
        System.out.println("i1^i2: "+(i1^i2) +" result: "+Integer.toBinaryString(i1^i2));
        System.out.println("~i1: "+(~i1) +" result: "+Integer.toBinaryString(~i1));
        System.out.println("~i2: "+(~i2) +" result: "+Integer.toBinaryString(~i2));
        // &= |= ^= 在测试时不要同时放开，会导致值在运算过程中改变和心里预期不一样
        // System.out.println("i1&=i2: "+(i1&=i2) +" result: "+Integer.toBinaryString(i1&=i2));
        // System.out.println("i1|=i2: "+(i1|=i2) +" result: "+Integer.toBinaryString(i1|=i2));
        // System.out.println("i1^=i2: "+(i1^=i2) +" result: "+Integer.toBinaryString(i1^=i2));
        /**
         * Output:
         * i1:26 i2:27
         * i1 binary: 11010 i2 binary: 11011
         * i1&i2: 26 result: 11010
         * i1|i2: 27 result: 11011
         * i1^i2: 1 result: 1
         * ~i1: -27 result: 11111111111111111111111111100101
         * ~i2: -28 result: 11111111111111111111111111100100
         * 负数情况下
         * i1:-26 i2:-27
         * i1 binary: 11111111111111111111111111100110 i2 binary: 11111111111111111111111111100101
         * i1&i2: -28 result: 11111111111111111111111111100100
         * i1|i2: -25 result: 11111111111111111111111111100111
         * i1^i2: 3 result: 11
         * ~i1: 25 result: 11001
         * ~i2: 26 result: 11010
         * 总结：
         *  & 都是1为1，否则为0
         *  | 一个为1就是1，否则为0
         *  ^ 不相等为1，否则为零
         *  ~ 按位反转，包括符号位也需要反转
         *  正数和负数计算方式一样结果却有些差异，原因是负数在计算机中使用的是补码 原码->反转->加1 = 补码
         *
         */
    }
}
